package com.dsl.quartz;

import com.dsl.entity.DiscussPost;
import com.dsl.service.DiscussPostService;
import com.dsl.service.ElasticsearchService;
import com.dsl.service.LikeService;
import com.dsl.utils.CommunityConstant;
import com.dsl.utils.RedisKeyUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * @Description 帖子计算分数定时任务Job类
 * @Author dsl
 * @Date 2024/9/21 下午2:09
 * @Version 1.0
 */
@Component
public class PostScoreRefreshJob implements Job, CommunityConstant {

    private static final Logger logger = LoggerFactory.getLogger(PostScoreRefreshJob.class);

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private LikeService likeService;

    @Autowired
    private ElasticsearchService elasticsearchService;

    //信电纪元
    private static final Date epoch;

    static {
        try{
            epoch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-09-09 00:00:00");
        }catch (ParseException e){
            throw new RuntimeException("初始化信电纪元失败！");
        }
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String redisKey = RedisKeyUtil.getPostScoreKey();
        BoundSetOperations operations = redisTemplate.boundSetOps(redisKey);

        if(operations.size() == 0){
            logger.info("[任务取消]-没有需要刷新的帖子!");
            return;
        }

        logger.info("[任务开始]-正在刷新帖子分数：{}", operations.size());

        while(operations.size() > 0){
            this.refresh((Integer)operations.pop());
        }

        logger.info("[任务结束]-帖子分数刷新完毕！");
    }

    private void refresh(Integer postId){
        DiscussPost post = discussPostService.getDiscussPostById(postId);
        if(post == null){
            logger.error("该帖子不存在：id = {}", postId);
            return;
        }

        //帖子是否加精
        boolean wonderful = post.getStatus() == 1;
        //评论数量
        int commentCount = post.getCommentCount();
        //点赞数量
        long likeCount = likeService.getEntityLikeCount(ENTITY_TYPE_POST, postId);

        //计算权重
        double w = (wonderful ? 75 : 0) + commentCount * 10 + likeCount * 2;
        //分数 = 帖子权重 + 距离天数
        double score = Math.log10(Math.max(w, 1)) + (post.getCreateTime().getTime() - epoch.getTime()) / (1000 * 60 * 60 * 24);
        // 更新帖子分数
        discussPostService.updateScore(postId, score);
        // 同步搜索数据
        post.setScore(score);
        elasticsearchService.saveDiscussPost(post);
    }


}
